#include "ReservedTable.h"
#include "Parser.tab.h"

typedef LALG::Parser::token token;

namespace LALG
{

/*
 *--------------------------------------------------------------------------------------
 *       Class:  ReservedTable
 *      Method:  ReservedTable
 * Description:  Constrói a tabela de palavras reservadas com os valores iniciais
 *--------------------------------------------------------------------------------------
 */
ReservedTable::ReservedTable()
{
    table =
    {
        {WD_PROGRAM,    token::T_PROGRAM},
        {WD_BEGIN,      token::T_BEGIN},
        {WD_END,        token::T_END},
        {WD_CONST,      token::T_CONST},
        {WD_VAR,        token::T_VAR},
        {WD_REAL,       token::T_REAL},
        {WD_INTEGER,    token::T_INTEGER},
        {WD_PROCEDURE,  token::T_PROCEDURE},
        {WD_ELSE,       token::T_ELSE},
        {WD_READLN,     token::T_READLN},
        {WD_WRITELN,    token::T_WRITELN},
        {WD_REPEAT,     token::T_REPEAT},
        {WD_UNTIL,      token::T_UNTIL},
        {WD_IF,         token::T_IF},
        {WD_THEN,       token::T_THEN},
        {WD_WHILE,      token::T_WHILE},
        {WD_DO,         token::T_DO},
    };
}

/*
 *--------------------------------------------------------------------------------------
 *       Class:  ReservedTable
 *      Method:  operator []
 * Description:  Verifica se o ID passado é uma palavra reservada
 *--------------------------------------------------------------------------------------
 */
TokenType ReservedTable::operator[](const string& word)
{
    TokenType type;
    try
    {
        type = table.at(word);
    }
    // É gerado essa exceção quando não encontrar na palavra na tabela
    catch(out_of_range& ex)
    {
        type = token::T_ID;
    }
    return type;
}

}
